{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "kernelspec": {
      "display_name": "Python (spinningup)",
      "language": "python",
      "name": "spinningup"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.6.8"
    },
    "colab": {
      "name": "04-Regression_TF_2.0.ipynb",
      "provenance": []
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "collapsed": true,
        "id": "oYccxxnp8n57",
        "colab_type": "text"
      },
      "source": [
        "# TensorFlow Regression Example"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "X_tOdBGk8n59",
        "colab_type": "text"
      },
      "source": [
        "## Creating Data"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "K8bjLm3F8n5-",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "UHypSMNw8n6B",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# 1 Million Points\n",
        "x_data = np.linspace(0.0,10.0,1000000)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OOp59-hl8n6F",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "noise = np.random.randn(len(x_data))"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Jj-MqFWI8n6K",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# y = mx + b + noise_levels\n",
        "b = 10\n",
        "\n",
        "y_true =  (2.5 * x_data ) + 15 + noise"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "gnVtQiQI8n6O",
        "colab_type": "code",
        "outputId": "17c54fa3-64ba-49de-9979-390ef8f297ec",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 286
        }
      },
      "source": [
        "sample_indx = np.random.randint(len(x_data),size=(250))\n",
        "plt.plot(x_data[sample_indx],y_true[sample_indx],'*')"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7fe7515b9a20>]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 5
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nL4uEDVgLAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uZyXbrKi8u8I",
        "colab_type": "text"
      },
      "source": [
        "# Tensorflow 2.0"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4zoFygqh8zM9",
        "colab_type": "code",
        "outputId": "ec76068e-20a6-4929-f943-2cc788901443",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "try:\n",
        "  # %tensorflow_version only exists in Colab.\n",
        "  %tensorflow_version 2.x\n",
        "except Exception:\n",
        "  pass"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "TensorFlow 2.x selected.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "KhVmpJD4_iy6",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "import tensorflow as tf"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "G6tk00Fv89Gh",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "BATCH_SIZE = 1000\n",
        "BATCHS = 10000\n",
        "\n",
        "display_step = 1000\n",
        "learning_rate = 0.001"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QQFOC1mh_Q66",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "w = tf.Variable(initial_value=0.)\n",
        "b = tf.Variable(initial_value=0.)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "cpeeW-Zf9BbK",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def next_batch(x_data, batch_size):\n",
        "    batch_index = np.random.randint(len(x_data),size=(BATCH_SIZE))\n",
        "    x_train = x_data[batch_index]\n",
        "    y_train = y_true[batch_index]\n",
        "    return x_train, y_train"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OgEPuJ-oBuSS",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "optimizer = tf.keras.optimizers.SGD(learning_rate= learing_rate)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "hIXdNnkNXryx",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x_train, y_train = next_batch(x_data, BATCH_SIZE)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_s7QyKzSYJxd",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "747ab284-2964-40f6-e2c1-f136e60f9345"
      },
      "source": [
        "y_train.reshape((-1,1)).shape"
      ],
      "execution_count": 37,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(1000, 1)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 37
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "RQQkd0HNXtps",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "37cdd878-1435-4a43-c6f6-2ba83bf31dea"
      },
      "source": [
        "x_train.reshape((-1,1)).shape"
      ],
      "execution_count": 33,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(1000, 1)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 33
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4GGPEpf79jod",
        "colab_type": "code",
        "outputId": "eb935f20-ce8b-4b6b-df3b-7d9ec35cfe4e",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        }
      },
      "source": [
        "for step in range(BATCHS):\n",
        "  x_train, y_train = next_batch(x_data, BATCH_SIZE)\n",
        "  with tf.GradientTape() as tape:\n",
        "    y_pred = w * x_train + b\n",
        "    # loss = tf.reduce_sum(tf.square(y_pred - y_train))/(BATCH_SIZE)\n",
        "    loss = tf.reduce_mean(tf.square(y_pred - y_train))\n",
        "  \n",
        "  \n",
        "  grads = tape.gradient(loss, [w, b])\n",
        "  optimizer.apply_gradients(grads_and_vars=zip(grads,[w,b]))\n",
        "  \n",
        "  if (step + 1) % display_step == 0 or step == 0:\n",
        "    print(\"Step : {}, loss : {} , w : {}, b : {}\".format(step, loss.numpy(), w.numpy(), b.numpy()))"
      ],
      "execution_count": 26,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Step : 0, loss : 813.4712524414062 , w : 0.31691431999206543, b : 0.05517519637942314\n",
            "Step : 999, loss : 20.257383346557617 , w : 3.821810245513916, b : 6.228170871734619\n",
            "Step : 1999, loss : 8.363652229309082 , w : 3.309018135070801, b : 9.620268821716309\n",
            "Step : 2999, loss : 4.025704383850098 , w : 2.998520851135254, b : 11.700251579284668\n",
            "Step : 3999, loss : 1.9712138175964355 , w : 2.805393695831299, b : 12.976557731628418\n",
            "Step : 4999, loss : 1.3898404836654663 , w : 2.6879377365112305, b : 13.758804321289062\n",
            "Step : 5999, loss : 1.073419451713562 , w : 2.613929271697998, b : 14.238375663757324\n",
            "Step : 6999, loss : 1.0848280191421509 , w : 2.569657564163208, b : 14.532112121582031\n",
            "Step : 7999, loss : 1.0170762538909912 , w : 2.540977716445923, b : 14.71386432647705\n",
            "Step : 8999, loss : 0.9608482718467712 , w : 2.5256636142730713, b : 14.82515811920166\n",
            "Step : 9999, loss : 1.05859375 , w : 2.5149433612823486, b : 14.893718719482422\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "K-jWJnsbCb9t",
        "colab_type": "code",
        "outputId": "ace707bf-b072-4bf9-e1dd-ca67018f9a4f",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 286
        }
      },
      "source": [
        "plt.plot(x_data[sample_indx],y_true[sample_indx],'*')\n",
        "plt.plot(x_data, w.numpy()*x_data+b.numpy(),'r')"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7f6d7689f748>]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 58
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nTkSuQmCC\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "af947_5gSOb_",
        "colab_type": "text"
      },
      "source": [
        "### Using Keras Models"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6YJuwaAGSWBd",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "class LinearModel(tf.keras.Model):\n",
        "  def __init__(self):\n",
        "    super().__init__()\n",
        "    self.dense = tf.keras.layers.Dense(\n",
        "        units=1)\n",
        "        # kernel_initializer=tf.zeros_initializer(),\n",
        "        # bias_initializer = tf.zeros_initializer())\n",
        "\n",
        "  def call(self,input):\n",
        "    output = self.dense(input)\n",
        "    return output\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "vvCaun-gVbMv",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "model = LinearModel()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "zhEtTjCrUojy",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "optimizer = tf.keras.optimizers.SGD(learning_rate=learning_rate)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "KJpw-Fg7VHNH",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 309
        },
        "outputId": "349057c4-1f78-45fd-93a7-34d3ecee84b1"
      },
      "source": [
        "for step in range(BATCHS):\n",
        "  x_train, y_train = next_batch(x_data, BATCH_SIZE)\n",
        "  x_train = x_train.reshape((-1,1))\n",
        "  y_train = y_train.reshape((-1,1))\n",
        "  with tf.GradientTape() as tape:    \n",
        "    y_pred = model(x_train)\n",
        "    loss = tf.reduce_mean((y_pred - y_train)**2)\n",
        "  grads = tape.gradient(loss, model.variables)\n",
        "  optimizer.apply_gradients(zip(grads, model.variables))\n",
        "  if step%1000 == 0:\n",
        "    print(\"Step: {} loss: {}\".format(step,loss.numpy()))"
      ],
      "execution_count": 20,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "WARNING:tensorflow:Layer linear_model_1 is casting an input tensor from dtype float64 to the layer's dtype of float32, which is new behavior in TensorFlow 2.  The layer has dtype float32 because it's dtype defaults to floatx.\n",
            "\n",
            "If you intended to run this layer in float32, you can safely ignore this warning. If in doubt, this warning is likely only an issue if you are porting a TensorFlow 1.X model to TensorFlow 2.\n",
            "\n",
            "To change all layers to have dtype float64 by default, call `tf.keras.backend.set_floatx('float64')`. To change just this layer, pass dtype='float64' to the layer constructor. If you are the author of this layer, you can disable autocasting by passing autocast=False to the base Layer constructor.\n",
            "\n",
            "Step: 0 loss: 484.9335632324219\n",
            "Step: 1000 loss: 20.907081604003906\n",
            "Step: 2000 loss: 8.306971549987793\n",
            "Step: 3000 loss: 4.338044166564941\n",
            "Step: 4000 loss: 2.01308274269104\n",
            "Step: 5000 loss: 1.4498724937438965\n",
            "Step: 6000 loss: 1.1431903839111328\n",
            "Step: 7000 loss: 1.0200426578521729\n",
            "Step: 8000 loss: 0.9427798986434937\n",
            "Step: 9000 loss: 0.9625763297080994\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "7yYOeG_5cL-W",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "w,b = model.variables"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "HgS9Mhk2cWNq",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 286
        },
        "outputId": "9c6f53d4-e776-4d31-bf62-8adf2d2d5dba"
      },
      "source": [
        "plt.plot(x_data[sample_indx],y_true[sample_indx],'*')\n",
        "plt.plot(x_data, w.numpy()[0]*x_data+b.numpy(),'r')"
      ],
      "execution_count": 29,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7fe74ed41748>]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 29
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "zbw-oZBX8n6S",
        "colab_type": "text"
      },
      "source": [
        "# TF Eager Execution\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_OcFXyWL8n6T",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "import tensorflow as tf"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3diK_5KV8n6X",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Set Eager API\n",
        "tf.enable_eager_execution()\n",
        "tfe = tf.contrib.eager"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "aYVlrE-78n6Z",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "BATCH_SIZE = 1000\n",
        "BATCHS = 10000"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jLHVq4AT8n6b",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def next_batch(x_data, batch_size):\n",
        "    batch_index = np.random.randint(len(x_data),size=(BATCH_SIZE))\n",
        "    x_train = x_data[batch_index]\n",
        "    y_train = y_true[batch_index]\n",
        "    return x_train, y_train"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AkohyyRv8n6f",
        "colab_type": "text"
      },
      "source": [
        "**Variables**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "g97e_Xdv8n6f",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "w_tfe = tf.Variable(np.random.uniform())\n",
        "b_tfe = tf.Variable(np.random.uniform(1,10))"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pq5R2A0w8n6j",
        "colab_type": "text"
      },
      "source": [
        "**Linear regression function**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "eeERhtI98n6k",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Linear regression (Wx + b)\n",
        "def linear_regression(inputs):\n",
        "    return inputs * w_tfe + b_tfe"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QdbdmM3H8n6o",
        "colab_type": "text"
      },
      "source": [
        "**Lost function: MS**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QhtlCGBx8n6p",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def mean_square_fn(model_fn, inputs, labels):\n",
        "    return tf.reduce_sum(tf.pow(model_fn(inputs) - labels, 2)) / (2 * BATCH_SIZE)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_Zcxe26i8n6u",
        "colab_type": "text"
      },
      "source": [
        "**Optimizer**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "g0w_9iaU8n6v",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)\n",
        "\n",
        "grad = tfe.implicit_gradients(mean_square_fn)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "BtozPYEZ8n6y",
        "colab_type": "code",
        "outputId": "a49e3b3f-e55f-48ab-bd19-037c87b881d2",
        "colab": {}
      },
      "source": [
        "# Initial cost\n",
        "x_train, y_train = next_batch(x_data, BATCH_SIZE)\n",
        "print(\"Initial cost= {:.9f}\".format(\n",
        "    mean_square_fn(linear_regression, x_train, y_train)),\n",
        "    \"W=\", w_tfe.numpy(), \"b=\", b_tfe.numpy())"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Initial cost= 301.666534424 W= 0.29334104 b= 2.6102347\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "k__19OUE8n61",
        "colab_type": "text"
      },
      "source": [
        "**Training**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "2rep3N2e8n62",
        "colab_type": "code",
        "outputId": "0daea9dd-7a2a-42b8-b315-8f42e83c2d1c",
        "colab": {}
      },
      "source": [
        "# Training\n",
        "display_step = 100\n",
        "for step in range(BATCHS):\n",
        "    \n",
        "    x_train, y_train = next_batch(x_data, BATCH_SIZE)\n",
        "    optimizer.apply_gradients(grad(linear_regression, x_train, y_train))\n",
        "\n",
        "    if (step + 1) % display_step == 0 or step == 0:\n",
        "        print(\"Epoch:\", '%04d' % (step + 1), \"cost=\",\n",
        "              \"{:.9f}\".format(mean_square_fn(linear_regression, x_train, y_train)),\n",
        "              \"W=\", w_tfe.numpy(), \"b=\", b_tfe.numpy())\n"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch: 0001 cost= 275.481536865 W= 0.42854565 b= 2.6336372\n",
            "Epoch: 0100 cost= 16.771112442 W= 4.11131 b= 3.4798746\n",
            "Epoch: 0200 cost= 16.047227859 W= 4.1926284 b= 3.7750118\n",
            "Epoch: 0300 cost= 15.135506630 W= 4.155428 b= 4.045262\n",
            "Epoch: 0400 cost= 14.601335526 W= 4.1137743 b= 4.309869\n",
            "Epoch: 0500 cost= 12.988318443 W= 4.07434 b= 4.5675364\n",
            "Epoch: 0600 cost= 13.962398529 W= 4.0381775 b= 4.8191485\n",
            "Epoch: 0700 cost= 11.749617577 W= 3.9993713 b= 5.064703\n",
            "Epoch: 0800 cost= 11.554651260 W= 3.9644341 b= 5.3054633\n",
            "Epoch: 0900 cost= 11.580221176 W= 3.928494 b= 5.5401406\n",
            "Epoch: 1000 cost= 11.125984192 W= 3.8980548 b= 5.770336\n",
            "Epoch: 1100 cost= 10.007103920 W= 3.862554 b= 5.9936194\n",
            "Epoch: 1200 cost= 9.616973877 W= 3.8300939 b= 6.2107058\n",
            "Epoch: 1300 cost= 9.293504715 W= 3.7960896 b= 6.4219265\n",
            "Epoch: 1400 cost= 9.302433968 W= 3.7648456 b= 6.6274505\n",
            "Epoch: 1500 cost= 8.918160439 W= 3.7349737 b= 6.8296146\n",
            "Epoch: 1600 cost= 8.196873665 W= 3.700922 b= 7.025527\n",
            "Epoch: 1700 cost= 8.114662170 W= 3.6736612 b= 7.217224\n",
            "Epoch: 1800 cost= 7.420712471 W= 3.646926 b= 7.405056\n",
            "Epoch: 1900 cost= 7.244167805 W= 3.6210873 b= 7.5892572\n",
            "Epoch: 2000 cost= 7.027961254 W= 3.595361 b= 7.7688875\n",
            "Epoch: 2100 cost= 6.667112827 W= 3.5663705 b= 7.94299\n",
            "Epoch: 2200 cost= 6.635849476 W= 3.5434058 b= 8.11352\n",
            "Epoch: 2300 cost= 6.271118164 W= 3.5149488 b= 8.278675\n",
            "Epoch: 2400 cost= 6.085773945 W= 3.4919684 b= 8.440779\n",
            "Epoch: 2500 cost= 5.780133724 W= 3.4696915 b= 8.599832\n",
            "Epoch: 2600 cost= 5.293220520 W= 3.4442346 b= 8.753782\n",
            "Epoch: 2700 cost= 4.847285271 W= 3.4196973 b= 8.903981\n",
            "Epoch: 2800 cost= 4.648473740 W= 3.3974876 b= 9.051678\n",
            "Epoch: 2900 cost= 4.737245083 W= 3.3806791 b= 9.197361\n",
            "Epoch: 3000 cost= 4.325105190 W= 3.3542683 b= 9.336985\n",
            "Epoch: 3100 cost= 4.441687107 W= 3.3339086 b= 9.473751\n",
            "Epoch: 3200 cost= 4.256507874 W= 3.31495 b= 9.606302\n",
            "Epoch: 3300 cost= 4.133140564 W= 3.294693 b= 9.736195\n",
            "Epoch: 3400 cost= 3.762845039 W= 3.2755926 b= 9.86446\n",
            "Epoch: 3500 cost= 3.711015701 W= 3.2582154 b= 9.988206\n",
            "Epoch: 3600 cost= 3.403789759 W= 3.2384858 b= 10.109075\n",
            "Epoch: 3700 cost= 3.416311502 W= 3.2214046 b= 10.227655\n",
            "Epoch: 3800 cost= 3.367571354 W= 3.204864 b= 10.343255\n",
            "Epoch: 3900 cost= 3.045504808 W= 3.1882067 b= 10.45586\n",
            "Epoch: 4000 cost= 3.017071247 W= 3.1692305 b= 10.565196\n",
            "Epoch: 4100 cost= 2.872391939 W= 3.153776 b= 10.671853\n",
            "Epoch: 4200 cost= 2.893660307 W= 3.1390457 b= 10.776576\n",
            "Epoch: 4300 cost= 2.697478056 W= 3.1202095 b= 10.878318\n",
            "Epoch: 4400 cost= 2.426154852 W= 3.107227 b= 10.978092\n",
            "Epoch: 4500 cost= 2.500243902 W= 3.0942423 b= 11.074939\n",
            "Epoch: 4600 cost= 2.320518017 W= 3.078808 b= 11.169363\n",
            "Epoch: 4700 cost= 2.285497665 W= 3.0669324 b= 11.26185\n",
            "Epoch: 4800 cost= 2.077934504 W= 3.0534801 b= 11.352316\n",
            "Epoch: 4900 cost= 2.126533985 W= 3.0373795 b= 11.439814\n",
            "Epoch: 5000 cost= 1.963438749 W= 3.0228853 b= 11.524724\n",
            "Epoch: 5100 cost= 1.893150449 W= 3.0125375 b= 11.609567\n",
            "Epoch: 5200 cost= 1.800761700 W= 2.999554 b= 11.69099\n",
            "Epoch: 5300 cost= 1.826110840 W= 2.9880226 b= 11.770436\n",
            "Epoch: 5400 cost= 1.718632936 W= 2.977614 b= 11.848662\n",
            "Epoch: 5500 cost= 1.741396189 W= 2.9636 b= 11.925114\n",
            "Epoch: 5600 cost= 1.685652852 W= 2.9538183 b= 11.999487\n",
            "Epoch: 5700 cost= 1.694853544 W= 2.9414043 b= 12.071367\n",
            "Epoch: 5800 cost= 1.520098925 W= 2.9319844 b= 12.142838\n",
            "Epoch: 5900 cost= 1.461071968 W= 2.91992 b= 12.211847\n",
            "Epoch: 6000 cost= 1.357613325 W= 2.9111903 b= 12.279675\n",
            "Epoch: 6100 cost= 1.475282669 W= 2.9010105 b= 12.344868\n",
            "Epoch: 6200 cost= 1.343915820 W= 2.892209 b= 12.409323\n",
            "Epoch: 6300 cost= 1.281312704 W= 2.8823316 b= 12.471721\n",
            "Epoch: 6400 cost= 1.285332322 W= 2.8736398 b= 12.532852\n",
            "Epoch: 6500 cost= 1.212053418 W= 2.8630872 b= 12.592061\n",
            "Epoch: 6600 cost= 1.218060493 W= 2.8541899 b= 12.649966\n",
            "Epoch: 6700 cost= 1.172313809 W= 2.847736 b= 12.706566\n",
            "Epoch: 6800 cost= 1.166100621 W= 2.8382943 b= 12.762114\n",
            "Epoch: 6900 cost= 1.098492861 W= 2.829959 b= 12.816151\n",
            "Epoch: 7000 cost= 1.063740015 W= 2.8225312 b= 12.868826\n",
            "Epoch: 7100 cost= 1.023402214 W= 2.8145664 b= 12.919719\n",
            "Epoch: 7200 cost= 0.982637823 W= 2.8071923 b= 12.969754\n",
            "Epoch: 7300 cost= 1.033883810 W= 2.7985566 b= 13.018748\n",
            "Epoch: 7400 cost= 0.994429886 W= 2.792207 b= 13.066607\n",
            "Epoch: 7500 cost= 0.954064608 W= 2.784292 b= 13.113034\n",
            "Epoch: 7600 cost= 0.927848518 W= 2.7786987 b= 13.158699\n",
            "Epoch: 7700 cost= 0.887622297 W= 2.7697585 b= 13.202898\n",
            "Epoch: 7800 cost= 0.881225646 W= 2.7627225 b= 13.245891\n",
            "Epoch: 7900 cost= 0.895305872 W= 2.7579055 b= 13.28829\n",
            "Epoch: 8000 cost= 0.851209164 W= 2.7529163 b= 13.3296385\n",
            "Epoch: 8100 cost= 0.745737910 W= 2.7459857 b= 13.370074\n",
            "Epoch: 8200 cost= 0.795846760 W= 2.7407546 b= 13.409106\n",
            "Epoch: 8300 cost= 0.850925267 W= 2.733101 b= 13.447238\n",
            "Epoch: 8400 cost= 0.762317002 W= 2.7285335 b= 13.484957\n",
            "Epoch: 8500 cost= 0.799837947 W= 2.7227023 b= 13.521192\n",
            "Epoch: 8600 cost= 0.793936789 W= 2.7185183 b= 13.557222\n",
            "Epoch: 8700 cost= 0.703119099 W= 2.7118874 b= 13.591786\n",
            "Epoch: 8800 cost= 0.688881338 W= 2.7092729 b= 13.626094\n",
            "Epoch: 8900 cost= 0.720998645 W= 2.7014139 b= 13.658497\n",
            "Epoch: 9000 cost= 0.728614748 W= 2.698639 b= 13.691119\n",
            "Epoch: 9100 cost= 0.673389077 W= 2.6924767 b= 13.722499\n",
            "Epoch: 9200 cost= 0.665706694 W= 2.6888242 b= 13.75342\n",
            "Epoch: 9300 cost= 0.681291282 W= 2.6839147 b= 13.783423\n",
            "Epoch: 9400 cost= 0.666010678 W= 2.678437 b= 13.812644\n",
            "Epoch: 9500 cost= 0.643584788 W= 2.6734912 b= 13.841193\n",
            "Epoch: 9600 cost= 0.676403344 W= 2.6705093 b= 13.869479\n",
            "Epoch: 9700 cost= 0.583694935 W= 2.6669464 b= 13.896692\n",
            "Epoch: 9800 cost= 0.559415162 W= 2.662542 b= 13.922997\n",
            "Epoch: 9900 cost= 0.641796768 W= 2.6587977 b= 13.94918\n",
            "Epoch: 10000 cost= 0.607424080 W= 2.654848 b= 13.974417\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uyDZ4L9T8n65",
        "colab_type": "text"
      },
      "source": [
        "**Results**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xV9nosR08n66",
        "colab_type": "code",
        "outputId": "021a8010-8e08-46a1-fc3a-865e6d57faf8",
        "colab": {}
      },
      "source": [
        "plt.plot(x_data[sample_indx],y_true[sample_indx],'*')\n",
        "plt.plot(x_data, w_tfe*x_data+b_tfe,'r')"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x1a4302d9b0>]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 16
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "emxjDLQR8n69",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}